/*
 * MsjReceptorMid.h
 *
 *  Created on: 12/02/2010
 *      Author: San Martín, Matías I.
 */

#ifndef MSJRECEPTORMID_H_
#define MSJRECEPTORMID_H_

#include <map>

#include "MsjReceptor.h"
#include "../../Framework/Shared/sem.h"
#include "../../Framework/Shared/shptr.h"
#include "../../Framework/Common/TemplateSingleton.h"
#include "../Comunicaciones/MiddlewareIO.h"

/**
 * MsjReceptor implementado para que lo use el middleware.
 *
 *
 */
class MsjReceptorMid : public MsjReceptor, private Singleton {
//------------------------------ CONSTANTES ------------------------------
public:
	typedef std::map<IdPlaneta,int> t_mapIdPlaneta_Pipe;

//--------------------------- ATRIBUTOS ------------------------------------
private:

	bool _ejecutar;

	/** semaforo que coordina la lectura de los datos de registro */
	Semaphore* _semLeyendoDatos;

	/** memoria donde se guardan los datos de registro */
	t_sharedRegistro* _datosRegitro;

	t_mapIdPlaneta_Pipe _mapPipes;

	MiddlewareIO* _receptor;

//------------------------------ METODOS ------------------------------
public:

	virtual ~MsjReceptorMid();

	void inicializar(MiddlewareIO* receptor, Semaphore* semLeyendoDatos, t_sharedRegistro* datosRegitro);

	/**
	 * Pre: se debe haber llamado a inicializar
	 * 		se debe haber iniciado al MiddlewareCliente
	 */
	void start();

	//TODO HACERLA UTIL, ENTRE PROCESOS NO SE PUEDEN DETENER
	void stop();

	virtual void registrarPipe(const std::string& nombrePipe,const IdPlaneta& idPlaneta);

private:

	int crearPipe(const std::string& nombrePipe);

	/**
	 * Handler de la señal que avisa que hay datos por registar
	 */
	static void handlerAvisoRegistrarPipe(int signal);

	/**
	 * Handler de la señal de detencion
	 */
	static void handlerDetencion(int signal);
};

typedef SingletonTemplate<MsjReceptorMid> MsjReceptorMidSingleton;

#endif /* MSJRECEPTORMID_H_ */

